
# 封装数据库工作类
class DBUtil(object):

    conn = None  # 类变量，存储连接对象
    @classmethod
    def __get_conn(cls,host="localhost", port=3306, user="root", password="123456", database="api_pymysql_database"):
        """
        私有化建立连接，使用者不需要看到该方法;使用类方法，在类外部可以直接调用，不再需要实例化对象
        :param host:主机地址
        :param port:端口号
        :param user:用户名
        :param password:密码
        :param database:数据库名称
        :return:返回一个非空连接对象
        """
        import pymysql
        if cls.conn == None:# 判断连接是否存在，若不存在则建立连接,因为，客户端和服务器之间只需要建立一条连接就足够了，不需要重复建立连接
            cls.conn = pymysql.connect(host=host, port=port, user=user,
                                   password=password, database=database, charset='utf8')
        return cls.conn# 返回一个非空连接

    @classmethod
    def __close_conn(cls):
        if cls.conn is not None:# 若连接还存在，则关闭连接，并将其置为空
            cls.conn.close()
            cls.conn = None

    @classmethod
    def select_one(cls,sql):
        """
        常用操作：查询一条数据
        :param sql:sql语句
        :return:以元组的形式返回查询的结果
        """
        cursor = None
        result = None
        try:
            # 获取连接
            cls.conn=cls.__get_conn()
            # 创建游标对象
            cursor=cls.conn.cursor()
            # 执行sql语句
            cursor.execute(sql)
            # 获取查询结果
            result =cursor.fetchone()
        except Exception as error:
            print("查询失败，错误信息:",str(error))
        finally:
            # 关闭游标
            cursor.close()
            # 关闭连接
            cls.__close_conn()
            return result

    @classmethod
    def uid_db(cls,sql):
        """
        常用操作：增删改
        :param sql:sql语句
        :return:返回查询结果
        """
        cursor=None
        # 获取连接
        cls.conn=cls.__get_conn()
        try:
            cursor = cls.conn.cursor()  # 创建游标对象
            # 执行sql语句
            cursor.execute(sql)
            print("影响的行数：",cursor.rowcount)  # 获取影响的行数
            # 增删改需要提交事务
            cls.conn.commit()
        except Exception as error:
            print("操作数据库失败,错误信息", str(error))
            # 回滚事务
            cls.conn.rollback()
        finally:
            # 关闭游标
            cursor.close()
            # 关闭连接
            cls.conn.close()
            return None  # 返回None表示操作成功，没有返回

if __name__ == '__main__':
    # 查询一条数据
    result=DBUtil.select_one("select * from areas where atitle='河南省';")
    print(result)
    # 插入一条数据
    DBUtil.uid_db("insert into areas(aid,atitle,pid) values (411000,'周口市',410000);")
